perm filename RUSS[AI,JMC] blob sn#005454 filedate 1971-08-13 generic text, type T, neo UTF8
	SKIPE COLOR
	MOVEI T1,22
	JRST KSIN
	CAMG I,LLIM	;ARE THERE ANY
	JRST RTVAL	;NO EVALUATE (RETURN VALUE FROM F.G.)
	MOVEM I,ACTPT#	;SET POINTER TO LAST ACTIVE MOVE
	MOVEM I,LLIM2#	;FOR THE USE OF FILL
LP:	CAMG I,LLIM	;MAIN LOOP. ANY MOVES LEFT?
	JRST ENDACT	;NO, END OF CHECKING FOR ACTIVITY
	MOVE 2,(I)	;GET THE NEXT MOVE
	JSR DOMOVE	;MAKE IT
	PUSHJ P,FGMA	;DO A FORCED GAME FOR ACTIVITY CHECK
	CAMLE THSVL	;IS IT ACTIVE MOVE
	SOS ACTPT	;YES, COUNT IT
	JSR UNMOVE	;RETRACT MOVE
	MOVE 2,(I)
	PUSHJ P,FILL	;PUT MOVE INTO TABLE
	SOJA I,LP	;NEXT MOVE
ENDACT:	MOVE I,ULIM	;NOW CHECK FOR LOSING. GET MOVE PTR
	MOVE K,I	;POINTER FOR DEPOSITING
	CAMG I,ACTPT	;ANY ACTIVE MOVES?
	JRST NOACT	;NONE
LP2:	CAMG I,ACTPT	;MAIN LOOP. MORE ACTIVE MOVES?
	JRST DOPAS	;DO PASSIVE MOVES
	MOVE 2,(I)	;GET A MOVE
	MOVEM 2,(K)	;SAVE IT
	JSR DOMOVE	;MAKE IT
	PUSHJ P,FGML	;DO A FORCED GAME TO CHECK FOR LOSING
	CAML BETA	;LOSING MOVE?
	SUBI K,1	;NO, KEEP IT
	JSR UNMOVE	;RETRACT MOVE
	SOJA I,LP2	;NEXT ONE
DOPAS:	MOVEI 2,1	;HOW MANY PASSIVE MOVES?
	MOVEM 2,PASCT	;SAVE IT
	CAME K,ULIM	;ANY ACTIVE MOVES FOUND
	JRST LP3	;YES KEEP IT AT ONE

NOACT:	MOVEI 2,3	;NO ACTIVE MOVES
	MOVEM 2,PASCT	;SO 3 PASSIVE ONES
LP3:	CAMG I,LLIM	;ANY MOVES LEFT
	JRST ENDMVS	;NO
	MOVE 2,(I)	;GET MOVE
	MOVEM 2,(K)	;SAVE IT
	JSR DOMOVE	;MAKE IT
	PUSHJ P,FGML	;CHECK FOR LOSING
	CAML BETA	;IS IT LOSING
	SUBI K,1	;NO A GOOD ONE
	JSR UNMOVE	;RETRACT MOVE
	CAML BETA	;CHECK AGAIN
	SOSE PASCT	;CHECK COUNT ONLY IF NOT LOSING
	SOJA I,LP3	;NEXT MOVE
	HLRZ 2,1(K)	;GET VALUE OF LAST MOVE
	HLRZ 3,-1(I)	;AND VALUE OF NEXT MOVE
	CAME 2,3	;SAME?
	JRST ENDMVS	;YES
	AOS PASCT	;GET ALL PASSIV OF SAME VALUE
	SOJA I,LP3	;CONTINUE
ENDMVS:	MOVEM K,LLIM	;RESET LOWER LIMIT
ENDMVG:	MOVE I,ULIM	;NOW TO CONTINUE TREE SEARCH
	CAMG I,LLIM	;OUT OF MOVES (I.E. NONE THERE)
	JRST RTVAL	;GIVE BACK THIS VALUE
LP4:	CAMG I,LLIM	;OUT OF MOVES?
	JRST RTBETA	;YES, RETURN BETA
	MOVE 2,(I)	;GET THE NEXT MOVE
	JSR DOMOVE	;MAKE IT
	PUSH P,ALPHA	;SAVE THE WORLD
	PUSH P,BETA
	PUSH P,LEVEL
	PUSH P,THSVL
	PUSH P,COLOR
	MOVN ALPHA	;INTERCHANGE ALPHA-BETA AND NEGATE
	EXCH BETA
	MOVNM ALPHA
	MOVEI 2,20
	XORM 2,COLOR	;CHANGE COLOR
	PUSHJ P,MKMOV	;RECURSIVE CALL
	POP P,COLOR
	POP P,THSVL
	POP P,LEVEL
	POP P,BETA
	POP P,ALPHA	;NOW YOU CAN HARDLY TELL WE WERE GONE
	JSR UNMOVE	;RETRACT THAT MOVE

	MOVNS	;NEGATE VALUE (ITS VALUE FOR OTHER COLOR)
	CAMLE ALPHA	;COMPARE TO ALPHA
	JRST RTALP	;TOO GOOD, WE COULDN'T GET HERE
	CAMG BETA	;CHECK WITH BETA
	SOJA I,LP4	;NOT GOOD ENOUGH, TRY NEXT ONE
	MOVEM BETA	;GOOD MOVE, REMEMBER IT
	MOVE 2,(I)	;GET THAT MOVE
	MOVE 3,LEVEL	;AND CURRENT LEVEL
	MOVEM 2,MVTB(3)	;SAVE IT IN TABLE OF MOVES
	CAME ALPHA	;IS BETA=ALPHA?
	SOJA I,LP4	;NO, NEXT MOVE
	POPJ P,		;YES THIS MOVE AND VALUE ARE FINE
RTBETA:	MOVE BETA	;VALUE OF THIS IS BETA
	POPJ P,
RTALP:	MOVE ALPHA	;RETURN ALPHA
	POPJ P,
RTVAL:	MOVE THSVL	;VALUE FROM F.G.
	POPJ P,


;NOW THE ROUTINE TO DO FORCED GAMES

FGM1:	SETZM ACGM#	;FLAG SAYING NOT ACTIVE GAME
	MOVEI 2,CKLIM	;THE LIMIT ON CHECKS
	MOVEM 2,CKSET#	;SAVE IT
FGM1E:	PUSH P,ULIM	;RECURSIVE CALL TO HERE. SAVE WORLD
	PUSH P,LLIM
	PUSH P,BETA
	PUSH P,ALPHA
	MOVE 2,LLIM	;RESET ULIM
	MOVEM 2,ULIM
	PUSHJ P,GENMOV	;GET MOVES GENERATED
	MOVE I,ULIM	;NOW LOOK AT THEM
	CAMG I,LLIM	;IF ANY
	JRST FEVAL	;GO EVALUATE
	MOVE K,ULIM	;STORING POINTER
FLP1:	CAMG I,LLIM	;ANY MOVES LEFT?
	JRST GFG	;NO MAKE MOVES LEFT IN TREE
	MOVE 2,COLOR	;SEE IF NOW IN CHECK
	IORI 2,4	;THIS IS OUR KING
	SKIPLE ATT(2)	;IS HE ATTACKED
	JRST NOWCK	;YES, IF IT GETS US OUT ITS GOOD
	PUSH P,K	;SAVE K
	MOVE 2,(I)	;GET THE MOVE
	JSR GOMOVE	;MAKE IT
	MOVE 2,COLOR	;NOW ARE WE IN CHECK?
	IORI 2,4
	SKIPLE ATT(2)
	JRST NGFM	;YES, THIS ONE NO GOOD
	MOVE 2,WCOUNT	;NOW CHECK VALUE
	SUB 2,BCOUNT
	SKIPE COLOR	;ARE WE DOING IT RIGHT WAY
	MOVNS 2		;NO, NEGATE
	CAMLE 2,BETA	;IS IT GOOD
	JRST OKFM	;YES A FORCED MOVE
	SKIPG CKSET	;SHOULD WE TRY FOR CHECK
	JRST NGFM	;NO SO NOT FORCED
	MOVE 2,COLOR	;YES
	XORI 2,24	;MAKE IT HIS KING
	SKIPG ATT(2)	;IS IT ATTACKED
	JRST NGFM	;NO, LAST HOPE GONE
OKFM:	SETZM OKMV#	;GOOD MOVE SET FLAG
	SKIPA
NGFM:	SETOM OKMV	;BAD MOVE
	JSR UNMOVE	;RETRACT IT
	POP P,K		;RESTOR STORE POINTER
	SKIPE OKMV	;GOOD MOVE?
	SOJA I,FLP1	;NO, TRY AGAIN

	MOVE 2,(I)	;GET THE MOVE
	MOVEM 2,(K)	;SAVE IT
	SUBI K,1	;CHANGE K TO MATCH
	SOJA I,FLP1	;TRY FOR MORE
NOWCK:	PUSH P,K	;SAVE K
	MOVE 2,(I)	;GET MOVE
	JSR GOMOVE	;MAKE IT
	MOVE 2,COLOR	;SEE IF STILL IN CHECK
	IORI 2,4
	SKIPLE ATT(2)
	JRST NGFM	;YES, BAD MOVE
	JRST OKFM	;NO, GOOD MOVE
CFG:	MOVEM K,LLIM	;READY TO GO DOWN TREE
	MOVE I,ULIM	;GET POINTER
	CAMG I,LLIM
	JRST FEVAL	;CALL THE EVALUATOR
FLP2:	CAMG I,LLIM	;ANY MOVES LEFT
	JRST FRTBT	;NO RETURN BETA
	MOVE 2,(I)	;GET MOVE
	JSR GOMOVE	;DO IT
	PUSH P,ALPHA	;SAVE THE WORLD
	PUSH P,BETA
	PUSH P,COLOR
	PUSH P,CKSET
	MOVN ALPHA	;EXCHANGE AND NEG. ALPHA- BETA
	EXCH BETA
	MOVNM ALPHA
	MOVE 2,COLOR	;SEE IF SHOULD CHANGE CKSET
	XORI 2,24	;HIS KING
	SKIPLE ATT(2)	;ATTACKED?
	SOS CKSET	;YES CHANGE THIS
	ANDI 2,20	;CHANGE COLOR
	MOVEM 2,COLOR	;HA. LUCKILY THE RIGHT THING IS AROUND
	PUSH P,TVL	;SAVE SOME MORE
	MOVE 2,[XWD 400000,1]	;LARGE AND NEGATIVE
	MOVEM 2,TVL
	PUSHJ P,FGM1E	;CONTINUE F.G.
	MOVNS		;NEGATE VALUE
	POP P,TVL	;RESTURE WORLD
	POP P,CJSET
	POP P,COLOR
	POP P,BETA
	POP P,ALPHA
	SKIPE ACGM	;ACTIVE GAME
	JRST ACVL	;YES SPECIAL VALUE JUDGEMENT
	CAMG BETA	;SIMILAR TO THAT IN MAKMOV
	JRST FGON

	CAML ALPHA
	JRST FRTALP
	MOVEM BETA	;A GOOD MOVE TO REMEMBER
FGON:	JSR UNMOVE	;RETRACT IT
	SOJA I,FLP2	;AND CONTINUE
FRTALP:	JSR UNMOVE	;RETURN ALPHA AFTER RETRACTION
	MOVE ALPHA
	JRST FPOP	;GO RESTORE SAVED THINGS
FRTBT:	MOVE BETA	;RETURNING BETA
	SKIPE ACGM	;ACTIVE GAME
	MOVE TVL	;THE RETURN TVL
FPOP:	POP P,ALPHA
	POP P,BETA
	POP P,LLIM
	POP P,ULIM
	POPJ P,		;FINALLY
ACVL:	CAMLE TVL	;ACTIVE EVALUATION
	MOVEM TVL	;BETTER, SO SAVE
	JRST FGON	;CONTINUE

;LOSING FORCED GAME

FGML:	PUSH P,BETA
	PUSH P,ALPHA
	MOVN 2,THSVL
	EXCH 2,ALPHA	;THIS BECOMES ALPHA (BECAUSE OF INVERSION)
	MOVNM 2,BETA	;ALL SET NOW
	PUSH P,COLOR	;BUT FOR THE COLOR
	MOVEI 2,20
	XORM 2,COLOR
	PUSHJ P,FGM1	;THE FORCED GAME
	POP P,COLOR
	POP P,ALPHA
	POP P,BETA	;ALL RESTORED
	MOVNS		;GET VALUE WITH PROPER SIGN
	POPJ P,

;ACTIVE FORCED GAME

FFMA:	PUSH P,BETA	;SAVE THINGS
	PUSH P,ALPHA
	MOVE 2,THSVL
	MOVEM 2,BETA	;SET BETA
	ADDI 2,400000	;+1
	MOVEM 2,ALPHA	;INTO ALPHA

	SETOM ACGM#	;AN ACTIVE GAME
	MOVE 2,[XWD 400000,1]	;LARGE AND NEGATIVE
	MOVEM 2,TVL
	PUSHJ P,FGM1+1	;TO SKIP SETZM ACGM INSTR
	POP P,ALPHA	;RESTORE
	POP P,BETA
	POPJ P,		;AND RETURN, NOTICE NO COLOR CHANGE

;GENERATE MOVES

GENMOV:	MOVE I,ULIM	;GET POINTER FOR STORING
	MOVE MOVER,COLOR	;GET COLOR (FIRST PIECE ON THIS SIDE)
	HRLI MOVER,-20		;20 PIECES
GMV1:	MOVE K,KIND(MOVER)	;GET KIND OF THIS PIECE
	JRST @GENTB(K)	;GO GENERATE RIGHT MOVERS
GENTB:	EXP GPN,GQRB,GKN,GQRB,GQRB,GKI
GQRB:	MOVE K,LM(MOVER)	;GET POINTER TO MOVE TABLE
	HLRE M,K	;GET NUMBER OF DIRECTIONS
	JRST PLG4	;GET INTO LOOP
PLG2:	ADDI K,10	;GET NEXT DIR. IN MOVE TABLE
	ANDI K,-10
PLG4:	SKIPGE T1,MOVE(K)	;IS THERE A MOVE
	JRST PLG3	;NO SET FOR NEXT DIR
PLG1:	ANDI T1,77	;GET DESTINATION
	SKIPGE T2,OCC(T1)	;SOMEONE THERE?
	JRST .+4	;NO, SO OK
	XOR T2,MOVER	;SEE IF SAME COLOR
	TRNN T2,20	;IS IT?
	JRST PLG3-2	;YES, NOT A GOOD MOVE
	MOVE T1,MOVE(K)	;GET THE MOVE AGAIN
	MOVEM T1,(I)	;STORE IT
	SUBI I,1	;DECREMENT POINTER
	SKIPL T1,MOVE+1(K)	;NEXT MOVE THERE?
	AOJA K,PLG1	;YES LOOK AT IT
PLG3:	AOJL M,PLG2	;TRY NEXT DIRECTION?
COMRG:	AOBJN MOVER,GMV1	;THIS ONE DONE TRY NEXT
	PUSHJ P,KCAS	;ALL DONE, TRY CASTLE (KINGSIDE OK?)
	JRST DOCS1	;NO TRY QUEEN SIDE
	MOVEI T1,KSCBT	;YES, SPECIAL FORMAT
	MOVEM T1,(I)	;ITS A MOVE
	SUBI I,1
DOCS1:	PUSHJ P,QCAS	;QUEEN SIDE OK?
	JRST DOCS2	;NO
	MOVEI T1,QSCBT	;THIS FORM OF MOVE
	MOVEM T1,(I)	;STORE IT
	SUBI I,1
DOCS2:	MOVEM I,LLIM	;SAVE THE LOWER LIMIT
	POPJ P,		;ALL MOVES GENERATED

;MOVES FOR KNIGHTS

GKN:	MOVE K,LM(MOVER)	;GET POINTER TO MOVE TABLE
	HRLI K,-10	;FIRST 10 LOCATIONS HAVE MOVES
GKN2:	SKIPGE T1,MOVE(K)	;IS THERE A MOVE THERE
	JRST GKN1	;NO
	ANDI T1,77	;SAME AS BEFORE WILL IT CAPTURE OWN PC.
	SKIPGE T2,OCC(T1)
	JRST .+4
	XOR T2,MOVER
	TRNN T2,20
	JRST GKN1
	MOVE T1,MOVE(K)
	MOVEM T1,(I)
	SUBI I,1
GKN1:	AOBJN K,GKN2	;TRY NEXT ONE
	JRST COMRG	;ALL DONE GO TRY NEXT PIECE

;MOVES OF KING DO NOT LOOK AT CHECK

GKI:	MOVE K,LM(MOVER)	;GET POINTER
	SKIPGE T1,MOVE(K)	;CHECK MOVE
	JRST GMVK1	;NONE THERE
	ANDI T1,77	;LOOK FAMILIAR??
	SKIPGE T2,OCC(T1)
	JRST .+4
	XOR T2,MOVER
	TRNN T2,20
	JRST GMVK1
	MOVE T1,MOVE(K)
	MOVEM T1,(I)
	SUBI I,1
GMVK1:	ADDI K,7	;ONLY FIRST MOVE IN EACH DIR.
	AOBJN K,GMVK+1
	JRST COMRG

;PAWN MOVES

GPN:	HRRZ K,LM(MOVER)	;GET POINTER
	SKIPGE T1,MOVE(K)	;FIRST 4 MOVES. FIRST THERE?
	JRST GMVP2	;NO, CHECK NEXT
	ANDI T1,77
	SKIPGE T2,OCC(T1)	;OCCUPIED
	JRST GMVP1P	;CHECK ENPASSANT
	XOR T2,MOVER	;CHECK COLOR
	TRNN T2,20
	JRST GMVP2	;WRONG COLOR
	MOVE T2,RANK(T1)	;CHECK FOR PROMOTION
	MOVE T1,MOVE(K)	;WILL WANT THIS ANYWAY
	CAIE T2,0
	CAIN T2,10
	PUSHJ P,PROMP	;IF RANK 0 OR 10 PROMOTE
	MOVEM T1,(I)	;NO PROMOTION, STORE MOVE
	SUBI I,1
	JRST GMVP2	;CHECK NEXT
GMVP1P:	TDNN FL,FOCC(T1)	;CHECK ENP. FLAGS
	JRST GMVP2	;NO SUCH LUCK
	MOVE T2,RANK(T1)	;YES, MUST BE RIGHT COLOR
	MOVE T1,MOVE(K)	;GET MOVE
	TRO T1,ENPAS	;ITS ENPAS.
	CAIE T2,0
	CAIN T2,10
	PUSHJ P,PROMP
	MOVEM T1,(I)
	SUBI I,1

;MAKE A MOVE. MOVE WILL BE IN AC 2

DOMOVE:	0
	PUSH P,I	;SAVE ALL IMPORTANT THINGS
	PUSH P,MOVED	;CELLS TELLING IF KINGS, ROOKS HAVE MOVED
	PUSH P,MOVED+1
	PUSH P,MOVED+2
	PUSH P,MOVED+20
	PUSH P,MOVED+21
	PUSH P,MOVED+22
	MOVEM 2,SV2#	;SAVE MOVE
	TRZ FL,CAP+KSC+QSC+PROM	;TURN OFF FLAGS TELLING
		;MOVE RETRACTOR THAT MOVE IS SPECIAL
	TRNE 2,KSCBT	;KING SIDE CASTLE?
	JRST KKSD	;YES
	TRNE 2,QSCBT	;QUEEN SIDE?
	JRST KQSD
	TRNE 2,PROMBT	;PROMOTION
	JRST PROMOT
	TRNE 2,ENPAS	;EN PASSANT?
	JRST ISENP
	TRNE 2,ENPSET	;SET UP EN PAS
	JRST SETENP
	LDB DEST,[POINT 6,SV2,35]	;NORMAL, GET DEST
	SKIPGE MOVER,OCC(DEST)	;OCCUPIED?
	JRST UNOC	;NO
	TRO FL,CAP	;IT'S A CAPTURE
	PUSH P,DEST	;SAVE DEST
	PUSH P,MOVER	;AND MOVER
	MOVNI DEST,1	;MOVE OFF BOARD
	PUSHJ P,PUTCH	;DO IT
	LDB DEST,[POINT 6,SV2,35]	;RESTORE DEST
UNOC:	LDB MOVER,[POINT 5,SV2,29]	;GET MOVER
	PUSH P,MOVER	;SAVE MOVER
	PUSH P,LOC(MOVER)	;AND WHERE IT CAME FROM
	PUSHJ P,PUTCH	;MAKE MOVE
	PUSH P,FL	;SAVE FLAGS
	JRST @DOMOVE	;RETURN


;SET UP FOR ENPAS

ENPSET:	LDB MOVER,[POINT 5,SV2,29]	;GET MOVER
	MOVE DEST,LM(MOVER)	;WANT LOC FOR E.P. CAPTURE
	LDB DEST,[POINT 6,MOVE+2(DEST),35]	;GET THAT PLACE
	MOVE DEST,FOCC(DEST)	;GET THE MAGIC BITS TO SET
	MOVEM DEST,SVOCC#	;SAVE UNTIL AFTER MOVE
	LDB DEST,[POINT 6,SV2,35]	;GET DEST
	PUSH P,MOVER	;SAVE MOVER
	PUSH P,LOC(MOVER)	;AND ORG
	PUSHJ P,PUTCH	;MAKE MOVE
	TDO FL,SVOCC	;SET E.P. BITS
	PUSH P,FL	;SAVE FLAGS
	JRST @DOMOVE	;RETURN

;E.P. CAPTURE

ISENP:	LDB DEST,[POINT 6,SV2,35]	;GET DEST
	MOVE DEST,ENP(DEST)	;USE SPECIAL TABLE FOR CAPT. LOC.
	MOVE MOVER,OCC(DEST)	;GET PAWN CAPTURED
	PUSH P,DEST		;SAVE
	PUSH P,MOVER		;ALSO WHO
	MOVNI DEST,1	;MOVE OFF BOARD
	PUSHJ P,PUTCH
	TRO FL,CAP		;RESTORE SAME AS FOR CAPTURE
	LDB DEST,[POINT 6,SV2,35]	;GET DEST
	JRST UNOC	;SAME FROM HERE

;DO PROMOTIONS

PROMOT:	TRO FL,PROM	;MAK AS PROMOTION
	LDB MOVER,[POINT 5,SV2,29]	;GET MOVER
	PUSH P,MOVER	;SAVE HIM
	PUSH P,LOC(MOVER9	;AND HIS LOCATION
	MOVNI DEST,1	;MOVE HIM OFF BOARD
	PUSHJ P,PUTCH
	PUSH P,LM(MOVER)	;SAVE OLD ENTRIES
	PUSH P,KIND(MOVER)
	MOVE T1,PCTB(MOVER)	;DISPLAY WORDS
	PUSH P,1(T1)
	PUSH P,2(T1)
	LDB DEST,[POINT 2,SV2,19]	;GET NEW KIND
	ADDI DEST,1		;MAKE IT INTO CORRECT KIND
	MOVEM DEST,KIND(MOVER)	;CHANGE KIND TABLE
	SUBI DEST,1	;MAGIC FOR PIECE SHAPE
	IOR DEST,COLOR
	MOVE DEST,PCTB(DEST)	;POINTER TO CORRECT SHAPE
	MOVE 2,1(DEST)
	MOVEM 2,1(T1)
	MOVE 2,2(DEST)
	MOVEM 2,2(T1)
	LDB DEST,[POINT 2,SV2,19]
	MOVEI T1,-10	;CHANGE LM TABLE
	CAIN DEST,1	;KNIGHT?
	MOVEI T1,7	;YES
	HRLM T1,LM(MOVER)	;CHANGE IT
	LDB DEST,[POINT 6,SV2,35]	;GET DEST
	PUSHJ P,PUTCH	;MAKE MOVE
	PUSH P,FL	;SAVE FLAGS
	JRST @DOMOVE	;RETURN

;CASTLE KING SIDE

KKSD:	MOVE MOVER,COLOR	;GET COLOR
	MOVE DEST,COLOR		;BOTH PLACES
	IORI MOVER,4		;KING
	IORI DEST,6		;RIGHT SQUARE
	PUSH P,MOVER	;SAVE
	PUSH P,DEST
	PUSHJ P,PUTCH		;WILL MAKE CAPTURE RETURN WORK
	MOVE MOVER,COLOR
	MOVE DEST,COLOR
	IORI MOVER,7	;ROOK
	IORI DEST,5
	PUSH P,MOVER
	PUSH P,DEST
	PUSHJ P,PUTCH
	TRO FL,CAP	;FAKE IT LIKE A CAPTURE
	PUSH P,FL
	JRST @DOMOVE

;CASTLE QUEEN SIDE

KQSD:	MOVE MOVER,COLOR	;SAME AS ABOVE
	MOVE DEST,COLOR
	IORI MOVER,4
	IORI MOVER,2
	PUSH P,MOVER
	PUSH P,DEST
	PUSHJ P,PUTCH
	MOVE MOVER,COLOR
	MOVE DEST,COLOR
	IORI DEST,3
	PUSH P,MOVER
	PUSH P,DEST
	PUSHJ P,PUTCH
	TRO FL,CAP
	PUSH P,FL
	JRST @DOMOVE

;CHECK FOR CASTLE POSSIBLE

KCAS:	MOVE T1,COLOR	;KING SIDE
	SKIPN MOVED(T1)	;KING MOVED?
	SKIPE MOVED+1(T1)	;OR ROOK?
	POPJ P,		;YES RETURN
	SKIPLE ATT+4(T1)	;KING IN CHECK?
	POPJ P,	;DON'T CASTLE
	MOVEI T1,5	;CHECK TO SEE IF CASTL THRU CHECK
	SKIPE COLOR
	MOVEI T1,25
KSIN:	SKIPGE OCC(T1)	;OR MAYBE THRU A PIECE
	SKIPL OCC+1(T1)
	POPJ P,
	HRLI T1,-20	;CHECK BEARING TABLE
	SKIPL T2,JBEAR(T1)	;ANYTHING?
	PUSHJ P,FBR	;YES, CHECK IT OUT
	ADDI T1,77	;CHACK NEXT DIR
	AOBJN T1,.-3	;CONTINUE IF MORE
	SUBI T1,1777	;NEXT SQUARE
	HRLI T1,-20	;SAME AS ABOVE
	SKIPL T2,JBEAR(T1)
	PUSHJ P,FBR
	ADDI T1,77
	AOBJN T1,.-3
	AOS (P)		;RETURN +1
	POPJ P,

QCAS:	MOVE T1,COLOR	;QUEEN SIDE
	SKIPN MOVED(T1)
	SKIPE MOVED+2(T1)
	POPJ P,		;SOMEONE MOVED
	SKIPLE ATT+4(T1)	;KING IN CHECK?
	POPJ P,
	MOVEI T1,2

;CHECK OF CHECKING

FBR:	XOR T2,COLOR	;IS HE SAME COLOR
	TRNN T2,20
	POPJ P,		;YES, NO THREAT
	MOVE T2,JBEAR(T1)	;GET HIM BACK
	MOVE K,KIND(T2)	;WHAT KIND
	CAIN K,PAWN
	JRST PNCK	;PAWN
	CAIN K,KING	;OR KING ARE SPECIAL
	JRST KNGCK
CTCK:	SUB P,[XWD 1,1]
	POPJ P,
KNGCK:	MOVE T2,LOC(T2)	;GET OTHER KINGS LOC
	LDB T2,DISTBL(T2)	;GET DISTANCE
	CAIE T2,1	;ONLY WORRY IF 1
	POPJ P,
	JRST CTCK
PNCK:	HRRZ K,T1	;GET JBEAR PTR
	MOVE T2,LM(T2)	;GET POINTER TO THAT PAWN'S MOVES
	CAME K,MOVE(T2)	;MUST MATCH EITHER 1ST OR 2ND
	CAMN K,MOVE+1(T2)
	JRST CTCK
	POPJ P,